﻿using GDM.Hogar.Controles.ControlesPersonalizados.Grilla;
using GDM.Hogar.Entidades;
using GDM.Hogar.Managers.Contratos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Configuracion
{
    public partial class CargoUC : UserControl, IUserControl
    {
        private readonly ICargoManager _cargoManager;

        private IList<Cargo> Datos { get; set; }

        private bool Editando { get; set; }

        public CargoUC(ICargoManager cargoManager)
        {
            if (cargoManager == null)
                throw new ArgumentNullException("cargoManager");

            _cargoManager = cargoManager;
            InitializeComponent();
        }

        public void LimpiarValidador()
        {
            this.validador1.Clear();
        }

        private void CargoUC_Load(object sender, EventArgs e)
        {
            Datos = _cargoManager.ObtenerCargos();
            cgCargo.Configure(Datos.AsQueryable());
            ttInfo.SetToolTip(btnEditarCargo, "Editar");
            if (cgCargo.Rows.Count <= 0) return;

            cgCargo.CurrentCell = null;
            cgCargo.ClearSelection();
        }

        private void RefrescarGrilla()
        {
            Datos = _cargoManager.ObtenerCargos();
            cgCargo.Search(Datos.AsQueryable(), x => true);
        }

        private void GuardarCargo()
        {
            try
            {
                _cargoManager.CrearCargo(txtCodigo.Text.Trim());
                txtCodigo.Clear();
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void ActualizarCargo(Cargo cargo)
        {
            try
            {
                _cargoManager.ActualizarCargo(cargo);
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void btnGuardarCargo_Click(object sender, EventArgs e)
        {
            if (!validador1.Validate()) return;

            if (!Editando)
            {
                GuardarCargo();
            }
            else
            {
                var cargoSeleccionado = (Cargo)cgCargo.SelectedRows[0].DataBoundItem;
                var codigoNuevo = txtCodigo.Text.Trim();
                if (!(cargoSeleccionado.Codigo.Equals(codigoNuevo)))
                {
                    cargoSeleccionado.Codigo = codigoNuevo;
                    ActualizarCargo(cargoSeleccionado);
                }
                CancelarEdicion();
            }
        }

        private void btnEditarCargo_Click(object sender, EventArgs e)
        {
            if (cgCargo.SelectedRows.Count == 0) return;

            Editando = true;
            var cargoSeleccionado = (Cargo)cgCargo.SelectedRows[0].DataBoundItem;
            txtCodigo.Text = cargoSeleccionado.Codigo;
            btnCancelar.Enabled = true;
        }

        private void CancelarEdicion()
        {
            Editando = false;
            txtCodigo.Clear();
            btnCancelar.Enabled = false;
            validador1.Clear();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void cgCargo_SelectionChanged(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void validador1_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (!Editando)
            {
                e.Valid = !Datos.Any(x => x.Codigo.Equals(txtCodigo.Text.Trim()));
            }
            else
            {
                var cargoSeleccionado = (Cargo)cgCargo.SelectedRows[0].DataBoundItem;
                e.Valid = !Datos.Any(x => x.CargoId != cargoSeleccionado.CargoId && (x.Codigo.Equals(txtCodigo.Text.Trim())));
            }
        }

        private void cgCargo_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            btnEditarCargo_Click(null, null);
        }
    }
}